﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using EntitiesLayer;
using DAL;
using Exceptions;

namespace BLL
{
    public class Gestor
    {

        private UnitOfWork UoW = new UnitOfWork();
        
       
        #region listarEjercicios 
        //metodo para listar todos los ejercicios de la base de datos
        public IEnumerable<Ejercicio> listarEjercicios()
        {
            return UoW.EjercicioRepository.GetAll();
        }
        #endregion listarEjercicios

        #region listarMusculos
        //metodo para listar todos los ejercicios de la base de datos
        public IEnumerable<Musculo> listaMusculos()
        {
            return UoW.MusculoRepository.GetAll();
        }
        #endregion listarMusculos

        #region agregarEjercicio
        //metodo para registrar un ejercicio
        public void agregarEjercicio(String pnombreComun, String pnombreOpcional, String pcodigo, String pimagenInicial, String pimagenFinal, String pnombreMusculoPrincipal, List<Musculo> plistaMusculos, String perroresComunes, String pindicacionesGenerales)
        {
            try
            {
                Ejercicio objEjercicio = new Ejercicio(pnombreComun, pnombreOpcional, pcodigo, pimagenInicial, pimagenFinal, pnombreMusculoPrincipal, plistaMusculos, perroresComunes, pindicacionesGenerales);
                if (objEjercicio.IsValid)
                {
                    UoW.EjercicioRepository.Insert(objEjercicio);
                    UoW.EjercicioRepository.Save();
                    UoW.EjercicioRepository.Clear();
                }
                else
                {
                    StringBuilder sb = new StringBuilder();
                    foreach (RuleViolation rv in objEjercicio.GetRuleViolations())
                    {
                        sb.AppendLine(rv.ErrorMessage);
                    }
                    throw new BusinessLogicException(sb.ToString());
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        #endregion

        #region filtrarListaEjercicios
        //metodo para filtrar la lista de ejercicios
        public IEnumerable<Ejercicio> filtrarListaEjercicios(String ptextoAfiltrar)
        {
            return UoW.EjercicioRepository.FiltrarListaEjercicios(ptextoAfiltrar);
        }

        #endregion filtrarListaEjercicios

        #region buscarEjercicio
        //metodo para buscar un ejercicio en especifico
        public Ejercicio buscarEjercicio(int pidEjercicio)
        {
            return UoW.EjercicioRepository.GetById(pidEjercicio);
        }



        #endregion

        #region consultarMusculosAsociados
        //metodo para consultar los musculos asociados a un ejercicio
         public IEnumerable<Musculo> consultarMusculosAsociados(int idEjercicio)
        {
            return UoW.EjercicioRepository.GetMusculosAsociados(idEjercicio);
        }
        #endregion consultarMusculosAsociados

         #region modificarEjercicio
        //metodo para modificar un ejercicio
         public void modificarEjercicio(int pidEjercicio, String pnombreComun, String pnombreOpcional, String pcodigo, String pimagenInicial, String pimagenFinal, String pnombreMusculoPrincipal, List<Musculo> plistaMusculos, String perroresComunes, String pindicacionesGenerales)
         {
             try
             {
                 //consultar un ejercicio por el id del mismo
                 Ejercicio objEjercicio = UoW.EjercicioRepository.GetById(pidEjercicio);

                 //setea los valores al ejercicio cargado
                 objEjercicio.NombreComun = pnombreComun;
                 objEjercicio.NombreOpcional = pnombreOpcional;
                 objEjercicio.Codigo = pcodigo;
                 objEjercicio.PosicionInicial = pimagenInicial;
                 objEjercicio.PosicionFinal = pimagenFinal;
                 objEjercicio.MusculoPrincipal = pnombreMusculoPrincipal;
                 objEjercicio.ListaMusculos = plistaMusculos;
                 objEjercicio.IndicacionesGenerales = pindicacionesGenerales;
                 objEjercicio.ErroresComunes = perroresComunes;

                  if (objEjercicio.IsValid)
                 {
                     UoW.EjercicioRepository.Update(objEjercicio);
                     UoW.EjercicioRepository.Save();
                     UoW.EjercicioRepository.Clear();
                 }
                 else
                 {
                     StringBuilder sb = new StringBuilder();
                     foreach (RuleViolation rv in objEjercicio.GetRuleViolations())
                     {
                         sb.AppendLine(rv.ErrorMessage);
                     }
                     throw new BusinessLogicException(sb.ToString());
                 }
             }
             catch (Exception ex)
             {

                 throw ex;
             }
         }

         #endregion

    }
}
